#include <iostream>

using namespace std;

/*
 *     分区模型   不同区存放的数据不同，赋予不同的生命周期，编程更灵活
 *          1、代码区   存放函数体的二进制代码，由操作系统进行管理的
 *          2、全局区   存放全局变量和静态变量以及常量
 *          3、栈区     由编译器自动分配释放，存放函数的参数值、局部变量等
 *          4、堆区     有程序员分配和释放，若不手动释放，在程序结束时由操作系统回收
 *
 *    程序运行前就会有代码区和全局区，运行后才会有栈区和堆区
 *    代码区
 *          1、存放CPU执行的机器指令
 *          2、代码区是共享的，对于频繁执行的程序，只需要在内存中有一份代码即可
 *          3、代码区是只读的，防止程序意外地修改指令
 *
 *    全局区
 *          1、全局变量和静态变量存放在此
 *          2、全局区还包含了常量区，字符串常量和其他常量(const 全局常量)也存放在此
 *          3、该区域的数据在程序结束后有操作系统释放
 */

// 全局变量
int g_a = 10;
int g_b = 10;

//全局常量
const int c_g_a = 10;
const int c_g_b = 10;

int main() {

    // 局部变量
   int l_a = 10;
   int l_b = 10;
   cout << "局部变量l_a的地址：" << &l_a << endl;
   cout << "局部变量l_b的地址：" << &l_b << endl;

   cout << "全局变量g_a的地址：" << &g_a << endl;
   cout << "全局变量g_b的地址：" << &g_b << endl;

   // 静态变量
   static int s_a = 10;
   static int s_b = 10;
   cout << "静态变量s_a的地址：" << &s_a << endl;
   cout << "静态变量s_b的地址：" << &s_b << endl;

   //字符串常量
//   string s = "hello, world!";
   cout << "字符串常量s的地址：" << &"hello, world!" << endl;

   cout << "全局常量c_g_a的地址：" << &c_g_a << endl;
   cout << "全局常量c_g_b的地址：" << &c_g_b << endl;

   //局部常量
   const int c_l_a = 10;
   const int c_l_b = 10;
   cout << "局部常量c_l_a的地址：" << &c_l_a << endl;
   cout << "局部常量c_l_b的地址：" << &c_l_b << endl;

   return 0;
}
